
function increment(x) {
    console.log('before ++ : ' , x );
    x++
    console.log('after ++ : ' , x );
}

let x = 100;
console.log('before increment: ', x);
increment(x);
console.log('after increment: ', x);

console.log( '- '.repeat(10) );

function hello(){
    // console.log(`你好，${name}`); // ReferenceError: Cannot access 'name' before initialization
    let username = '阿芳';
    console.log(`你好，${username}`);
}

hello();
// console.log(username); // ReferenceError: username is not defined

console.log( '- '.repeat(10) );

function welcome(){
    // 变量声明被前置(包括声明变量和为变量赋予默认值)
    console.log(`你好，${nickname}`); // `你好，undefined`
    var nickname = '小芳';
    console.log(`你好，${nickname}`); // `你好，小芳`
}

welcome();
// console.log(nickname); // ReferenceError: nickname is not defined

/*
console.log( '- '.repeat(10) );

function show(){
    console.log(`你好，${fullName}`); // `你好，undefined`
    fullName = '李小芳'; // ReferenceError: fullName is not defined
    console.log(`你好，${fullName}`); // `你好，李小芳`
}

console.log(fullName); // ReferenceError: fullName is not defined
show();
console.log(fullName); // ReferenceError: fullName is not defined
*/

// 总结:
// 在函数内部使用 var 、let 、 const 定义的变量只能在该函数内使用
// 但是:
// 用 var 定义的变量的声明和初始化会被前置到函数顶部，因此在源代码中定义变量语句之前可以使用var定义的变量
// 用 let 和 const 定义的变量，其声明也会被前置，但是初始化没有被前置，因此在源代码中定义变量语句之前不能使用let或const定义的变量
// 因此用 let 和 const 定义的变量是`块级作用域`

console.log( '= '.repeat(50) );
console.log( arguments.callee.toString() );